Pythonã®structã¢ãžã¥ãŒã«ã䜿ã£ãå¹ççãªãã€ããªããŒã¿åŠçããããã¯ãŒã¯ããã¡ã€ã«åœ¢åŒã®ããã®ããŒã¿ãããã³ã°ã»ã¢ã³ãããã³ã°æ¹æ³ãåŠã³ãŸããããäžççãªäœ¿çšäŸã玹ä»ã
Pythonã®structã¢ãžã¥ãŒã«ïŒãã€ããªããŒã¿ã®ãããã³ã°ãšã¢ã³ãããã³ã°ãè§£æ
ãœãããŠã§ã¢éçºã®äžçã§ã¯ãç¹ã«äœã¬ãã«ããã°ã©ãã³ã°ããããã¯ãŒã¯éä¿¡ããŸãã¯ãã¡ã€ã«åœ¢åŒã®æäœãæ±ãéã«ããã€ããªããŒã¿ãå¹ççã«ããã¯ããã³ã¢ã³ããã¯ããèœåãäžå¯æ¬ ã§ããPythonã®struct
ã¢ãžã¥ãŒã«ã¯ããããã®ã¿ã¹ã¯ãåŠçããããã®åŒ·åã§å€æ©èœãªããŒã«ããããæäŸããŸãããã®å
æ¬çãªã¬ã€ãã§ã¯ãstruct
ã¢ãžã¥ãŒã«ã®è€éããæãäžããäžçäžã®èªè
ã察象ãšããããŸããŸãªåœéçãªæèã«é¢é£ããäŸã瀺ããªããããã€ããªããŒã¿æäœããã¹ã¿ãŒããããã®ç¥èãšå®è·µçãªã¹ãã«ã身ã«ã€ããŠããã ããŸãã
structã¢ãžã¥ãŒã«ãšã¯ïŒ
Pythonã®struct
ã¢ãžã¥ãŒã«ã¯ãPythonã®å€ãšãPythonã®bytesãªããžã§ã¯ããšããŠè¡šçŸãããCã®æ§é äœãšã®éã§å€æãè¡ãããšãã§ããŸããæ¬è³ªçã«ãããã«ãã以äžã®ããšãå¯èœã«ãªããŸãïŒ
- ããã¯ïŒPythonã®å€ããã€ãæååã«å€æããŸããããã¯ããããã¯ãŒã¯çµç±ã§ããŒã¿ãéä¿¡ããããç¹å®ã®ãã€ããªåœ¢åŒã§ãã¡ã€ã«ã«ããŒã¿ãæžã蟌ãã ãããå¿ èŠãããå Žåã«ç¹ã«äŸ¿å©ã§ãã
- ã¢ã³ããã¯ïŒãã€ãæååãPythonã®å€ã«å€æããŸããããã¯éã®ããã»ã¹ã§ããã€ãæååãè§£éããŠåºã«ãªãããŒã¿ãæœåºããŸãã
ãã®ã¢ãžã¥ãŒã«ã¯ã以äžã®ãããªããŸããŸãªã·ããªãªã§ç¹ã«äŸ¡å€ããããŸãïŒ
- ãããã¯ãŒã¯ããã°ã©ãã³ã°ïŒãããã¯ãŒã¯ãã±ããã®æ§ç¯ãšè§£æã
- ãã¡ã€ã«I/OïŒç»å圢åŒïŒäŸïŒPNGãJPEGïŒãé³å£°åœ¢åŒïŒäŸïŒWAVãMP3ïŒãããã³ã«ã¹ã¿ã ãã€ããªåœ¢åŒãªã©ã®ãã€ããªãã¡ã€ã«ã®èªã¿æžãã
- ããŒã¿ã·ãªã¢ã©ã€ãŒãŒã·ã§ã³ïŒããŒã¿æ§é ãã¹ãã¬ãŒãžãéä¿¡ã®ããã«ãã€ã衚çŸã«å€æããã
- Cã³ãŒããšã®é£æºïŒãã€ããªããŒã¿åœ¢åŒã䜿çšããCãŸãã¯C++ã§æžãããã©ã€ãã©ãªãšã®å¯Ÿè©±ã
äžå¿çãªæŠå¿µïŒãã©ãŒãããæååãšãã€ããªãŒããŒ
struct
ã¢ãžã¥ãŒã«ã®å¿èéšã¯ããã®ãã©ãŒãããæååã«ãããŸãããããã®æååã¯ããŒã¿ã®ã¬ã€ã¢ãŠããå®çŸ©ãããã€ãæååå
ã®ããŒã¿ãã£ãŒã«ãã®åãšé åºãæå®ããŸãããã©ãŒãããæååã®åæåã¯ç¹å®ã®ããŒã¿åã衚ãããããã®æåãçµã¿åãããŠãã€ããªããŒã¿ã®æ§é ã«äžèŽãããã©ãŒãããæååãäœæããŸãã
以äžã¯ãäžè¬çãªãã©ãŒãããæåã®è¡šã§ãïŒ
æå | Cã®å | Pythonã®å | ãµã€ãº (ãã€ããéåžž) |
---|---|---|---|
x |
ããã£ã³ã°ãã€ã | - | 1 |
c |
char | é·ã1ã®æåå | 1 |
b |
signed char | æŽæ° | 1 |
B |
unsigned char | æŽæ° | 1 |
? |
_Bool | bool | 1 |
h |
short | æŽæ° | 2 |
H |
unsigned short | æŽæ° | 2 |
i |
int | æŽæ° | 4 |
I |
unsigned int | æŽæ° | 4 |
l |
long | æŽæ° | 4 |
L |
unsigned long | æŽæ° | 4 |
q |
long long | æŽæ° | 8 |
Q |
unsigned long long | æŽæ° | 8 |
f |
float | float | 4 |
d |
double | float | 8 |
s |
char[] | string | (ãã€ãæ°ãéåžž) |
p |
char[] | string | (ãã€ãæ°ãå é ã«é·ããä»äž) |
ãã€ããªãŒããŒïŒããäžã€ã®éèŠãªåŽé¢ã¯ããã€ããªãŒããŒïŒãšã³ãã£ã¢ã³ãšãåŒã°ããïŒã§ããããã¯ãè€æ°ãã€ãã®å€ã§ãã€ããé 眮ãããé åºãæããŸããäž»ãªãã€ããªãŒããŒã¯2ã€ãããŸãïŒ
- ããã°ãšã³ãã£ã¢ã³ïŒæäžäœãã€ãïŒMSBïŒãæåã«æ¥ãŸãã
- ãªãã«ãšã³ãã£ã¢ã³ïŒæäžäœãã€ãïŒLSBïŒãæåã«æ¥ãŸãã
ãã©ãŒãããæååã§ä»¥äžã®æåã䜿çšããŠãã€ããªãŒããŒãæå®ã§ããŸãïŒ
@
ïŒãã€ãã£ããã€ããªãŒããŒïŒå®è£ äŸåïŒã=
ïŒãã€ãã£ããã€ããªãŒããŒïŒå®è£ äŸåïŒã§ãããæšæºãµã€ãºã䜿çšã<
ïŒãªãã«ãšã³ãã£ã¢ã³ã>
ïŒããã°ãšã³ãã£ã¢ã³ã!
ïŒãããã¯ãŒã¯ãã€ããªãŒããŒïŒããã°ãšã³ãã£ã¢ã³ïŒãããã¯ãããã¯ãŒã¯ãããã³ã«ã®æšæºã§ãã
ç¹ã«ç°ãªãã·ã¹ãã éã§ããŒã¿ã亀æããå Žåãããããã¯ãŒã¯ãããã³ã«ãæ±ãå Žåãäžçäžã®ã·ã¹ãã ãç°ãªããã€ãã£ããã€ããªãŒããŒãæã€å¯èœæ§ããããããããŒã¿ã®ãããã³ã°ãšã¢ã³ãããã³ã°æã«æ£ãããã€ããªãŒããŒã䜿çšããããšãäžå¯æ¬ ã§ãã
ããŒã¿ã®ãããã³ã°
struct.pack()
颿°ã¯ãPythonã®å€ãbytesãªããžã§ã¯ãã«ããã¯ããããã«äœ¿çšãããŸããåºæ¬çãªæ§æã¯æ¬¡ã®ãšããã§ãïŒ
struct.pack(format, v1, v2, ...)
ããã§ïŒ
format
ã¯ãã©ãŒãããæååã§ããv1, v2, ...
ã¯ããã¯ããPythonã®å€ã§ãã
äŸïŒæŽæ°ãæµ®åå°æ°ç¹æ°ãæååãbytesãªããžã§ã¯ãã«ããã¯ããããšããŸããæ¬¡ã®ãããªã³ãŒãã䜿çšããŸãïŒ
import struct
packed_data = struct.pack('i f 10s', 12345, 3.14, b'hello')
print(packed_data)
ãã®äŸã§ã¯ïŒ
'i'
ã¯ç¬Šå·ä»ãæŽæ°ïŒ4ãã€ãïŒã衚ããŸãã'f'
ã¯æµ®åå°æ°ç¹æ°ïŒ4ãã€ãïŒã衚ããŸãã'10s'
ã¯10ãã€ãã®æååã衚ããŸããæååçšã«äºçŽãããã¹ããŒã¹ã«æ³šæããŠãã ãããæååãçãå Žåããã«ãã€ãã§ããã£ã³ã°ãããŸããæååãé·ãå ŽåãåãæšãŠãããŸãã
åºåã¯ãããã¯ãããããŒã¿ã衚ãbytesãªããžã§ã¯ãã«ãªããŸãã
å®è·µçãªæŽå¯ïŒæååãæ±ãéã«ã¯ããã©ãŒãããæååã§æååã®é·ããå¿ ãèæ ®ããŠãã ãããããŒã¿ã®ç Žæãäºæããªãåäœãé¿ããããã«ããã«ããã£ã³ã°ãåãæšãŠã«æ³šæããŠãã ãããäŸãã°ãå ¥åæååã®é·ããäºæ³ãè¶ ããå Žåãªã©ãæœåšçãªæååé·ã®åé¡ãé©åã«ç®¡çããããã«ãã³ãŒãã«ãšã©ãŒãã³ããªã³ã°ãå®è£ ããããšãæ€èšããŠãã ããã
ããŒã¿ã®ã¢ã³ãããã³ã°
struct.unpack()
颿°ã¯ãbytesãªããžã§ã¯ããPythonã®å€ã«ã¢ã³ããã¯ããããã«äœ¿çšãããŸããåºæ¬çãªæ§æã¯æ¬¡ã®ãšããã§ãïŒ
struct.unpack(format, buffer)
ããã§ïŒ
format
ã¯ãã©ãŒãããæååã§ããbuffer
ã¯ã¢ã³ããã¯ããbytesãªããžã§ã¯ãã§ãã
äŸïŒåã®äŸã«ç¶ããŠãããŒã¿ãã¢ã³ããã¯ããã«ã¯ã次ã®ããã«ããŸãïŒ
import struct
packed_data = struct.pack('i f 10s', 12345, 3.14, b'hello')
unpacked_data = struct.unpack('i f 10s', packed_data)
print(unpacked_data)
åºåã¯ãã¢ã³ããã¯ãããå€ãå«ãã¿ãã«ã«ãªããŸãïŒ(12345, 3.140000104904175, b'hello\x00\x00\x00\x00\x00')
ãæµ®åå°æ°ç¹æ°ã®è¡šçŸã«ãããæµ®åå°æ°ç¹å€ã«ã¯ããããªç²ŸåºŠã®éããããå Žåãããããšã«æ³šæããŠãã ããããŸãã10ãã€ãã®æååãããã¯ãããããã¢ã³ããã¯ãããæååã¯çãå Žåã«ãã«ãã€ãã§ããã£ã³ã°ãããŸãã
å®è·µçãªæŽå¯ïŒã¢ã³ããã¯ããéã«ã¯ããã©ãŒãããæååãbytesãªããžã§ã¯ãã®æ§é ãæ£ç¢ºã«åæ ããŠããããšã確èªããŠãã ãããäžäžèŽããããšãããŒã¿ã®è§£éã誀ã£ããããšã©ãŒãçºçãããããå¯èœæ§ããããŸããè§£æããããšããŠãããã€ããªåœ¢åŒã®ããã¥ã¡ã³ãã仿§ãæ³šææ·±ãåç §ããããšãéåžžã«éèŠã§ãã
å®è·µçãªäŸïŒã°ããŒãã«ãªå¿çš
struct
ã¢ãžã¥ãŒã«ã®å€æ©èœæ§ã瀺ãããã€ãã®å®è·µçãªäŸãæ¢ã£ãŠã¿ãŸãããããããã®äŸã¯ãã°ããŒãã«ãªèŠç¹ãæäŸãã倿§ãªæèã§ã®å¿çšã瀺ããŸãã
1. ãããã¯ãŒã¯ãã±ããã®æ§ç¯ïŒäŸïŒUDPãããïŒ
ãããã¯ãŒã¯ãããã³ã«ã¯ãããŒã¿éä¿¡ã«ãã°ãã°ãã€ããªåœ¢åŒã䜿çšããŸããstruct
ã¢ãžã¥ãŒã«ã¯ããããã®ãã±ããã®æ§ç¯ãšè§£æã«æé©ã§ãã
ç°¡ç¥åãããUDPïŒUser Datagram ProtocolïŒããããèããŠã¿ãŸããããsocket
ã®ãããªã©ã€ãã©ãªããããã¯ãŒã¯ããã°ã©ãã³ã°ãç°¡çŽ åããŸãããåºç€ãšãªãæ§é ãçè§£ããããšã¯æçã§ããUDPãããã¯éåžžãéä¿¡å
ããŒããå®å
ããŒããé·ããããã³ãã§ãã¯ãµã ã§æ§æãããŸãã
import struct
source_port = 12345
destination_port = 80
length = 8 # Header length (in bytes) - simplified example.
checksum = 0 # Placeholder for a real checksum.
# Pack the UDP header.
udp_header = struct.pack('!HHHH', source_port, destination_port, length, checksum)
print(f'UDP Header: {udp_header}')
# Example of how to unpack the header
(src_port, dest_port, length_unpacked, checksum_unpacked) = struct.unpack('!HHHH', udp_header)
print(f'Unpacked: Source Port: {src_port}, Destination Port: {dest_port}, Length: {length_unpacked}, Checksum: {checksum_unpacked}')
ãã®äŸã§ã¯ããã©ãŒãããæååã®'!'
æåããããã¯ãŒã¯ãã€ããªãŒããŒïŒããã°ãšã³ãã£ã¢ã³ïŒãæå®ããŠãããããã¯ãããã¯ãŒã¯ãããã³ã«ã®æšæºã§ãããã®äŸã¯ããããã®ããããã£ãŒã«ããããã¯ããã³ã¢ã³ããã¯ããæ¹æ³ã瀺ããŠããŸãã
äžççãªé¢é£æ§ïŒããã¯ããªã¢ã«ã¿ã€ã ã®ãããªäŒè°ããªã³ã©ã€ã³ã²ãŒã ïŒãµãŒããŒãäžçäžã«é 眮ãããŠããïŒãããã³å°ççãªå¢çãè¶ããå¹ççã§äœé å»¶ã®ããŒã¿è»¢éã«äŸåãããã®ä»ã®ã¢ããªã±ãŒã·ã§ã³ãªã©ããããã¯ãŒã¯ã¢ããªã±ãŒã·ã§ã³ãéçºããããã«äžå¯æ¬ ã§ããæ£ãããã€ããªãŒããŒã¯ããã·ã³éã®é©åãªéä¿¡ã«äžå¯æ¬ ã§ãã
2. ãã€ããªãã¡ã€ã«ã®èªã¿æžãïŒäŸïŒBMPç»åãããïŒ
å€ãã®ãã¡ã€ã«åœ¢åŒã¯ãã€ããªæ§é ã«åºã¥ããŠããŸããstruct
ã¢ãžã¥ãŒã«ã¯ããããã®åœ¢åŒã«åŸã£ãŠããŒã¿ãèªã¿æžãããããã«äœ¿çšãããŸããåçŽãªç»å圢åŒã§ããBMPïŒããããããïŒç»åã®ããããèããŠã¿ãŸãããã
import struct
# Sample data for a minimal BMP header
magic_number = b'BM' # BMP file signature
file_size = 54 # Header size + image data (simplified)
reserved = 0
offset_bits = 54 # Offset to pixel data
header_size = 40
width = 100
height = 100
planes = 1
bit_count = 24 # 24 bits per pixel (RGB)
# Pack the BMP header
header = struct.pack('<2sIHHIIHH', magic_number, file_size, reserved, offset_bits, header_size, width, height, planes * bit_count // 8) # Correct byte order and calculation. The planes * bit_count is the number of bytes per pixel
print(f'BMP Header: {header.hex()}')
# Writing the header to a file (Simplified, for demonstration)
with open('test.bmp', 'wb') as f:
f.write(header)
f.write(b'...' * 100 * 100) # Dummy pixel data (simplified for demonstration).
print('BMP header written to test.bmp (simplified).')
#Unpacking the header
with open('test.bmp', 'rb') as f:
header_read = f.read(14)
unpacked_header = struct.unpack('<2sIHH', header_read)
print(f'Unpacked header: {unpacked_header}')
ãã®äŸã§ã¯ãBMPããããã£ãŒã«ããbytesãªããžã§ã¯ãã«ããã¯ããŸãããã©ãŒãããæååã®'<'
æåã¯ãBMPãã¡ã€ã«ã§äžè¬çãªãªãã«ãšã³ãã£ã¢ã³ã®ãã€ããªãŒããŒãæå®ããŸããããã¯ãã¢ã³ã¹ãã¬ãŒã·ã§ã³ã®ããã®ç°¡ç¥åãããBMPãããã§ããå®å
šãªBMPãã¡ã€ã«ã«ã¯ãããããããæ
å ±ããããã«ã©ãŒããŒãã«ïŒã€ã³ããã¯ã¹ã«ã©ãŒã®å ŽåïŒãããã³ç»åããŒã¿ãå«ãŸããŸãã
äžççãªé¢é£æ§ïŒããã¯ãå»çç»åãè¡æç»åè§£æãããã³äžçäžã®ãã¶ã€ã³ã»ã¯ãªãšã€ãã£ãç£æ¥ã§äœ¿çšãããç»ååŠçãœãããŠã§ã¢ãªã©ã®ã¢ããªã±ãŒã·ã§ã³ã«ãšã£ãŠéèŠãªãã°ããŒãã«ãªç»åãã¡ã€ã«åœ¢åŒãšäºææ§ã®ãããã¡ã€ã«ãè§£æããã³äœæããèœåã瀺ããŠããŸãã
3. ã¯ãã¹ãã©ãããã©ãŒã éä¿¡ã®ããã®ããŒã¿ã·ãªã¢ã©ã€ãŒãŒã·ã§ã³
ç°ãªãããŒããŠã§ã¢ã¢ãŒããã¯ãã£ãæã€ã·ã¹ãã éïŒäŸãã°ãããã°ãšã³ãã£ã¢ã³ã·ã¹ãã ã§å®è¡ãããŠãããµãŒããŒãšãªãã«ãšã³ãã£ã¢ã³ã·ã¹ãã ã®ã¯ã©ã€ã¢ã³ãïŒã§ããŒã¿ã亀æããå Žåãstruct
ã¢ãžã¥ãŒã«ã¯ããŒã¿ã·ãªã¢ã©ã€ãŒãŒã·ã§ã³ã«ãããŠéèŠãªåœ¹å²ãæããããšãã§ããŸããããã¯ãPythonããŒã¿ããã©ãããã©ãŒã ã«äŸåããªããã€ããªè¡šçŸã«å€æããããšã«ãã£ãŠéæãããŸããããã«ãããã¿ãŒã²ããããŒããŠã§ã¢ã«é¢ä¿ãªããããŒã¿ã®äžè²«æ§ãšæ£ç¢ºãªè§£éãä¿èšŒãããŸãã
äŸãã°ãã²ãŒã ãã£ã©ã¯ã¿ãŒã®ããŒã¿ïŒäœåãäœçœ®ãªã©ïŒããããã¯ãŒã¯çµç±ã§éä¿¡ããå ŽåãèããŠã¿ãŸããããstruct
ã䜿çšããŠãã®ããŒã¿ãã·ãªã¢ã©ã€ãºããç¹å®ã®ãã€ããªåœ¢åŒãå®çŸ©ããããšãã§ããŸããåä¿¡åŽã®ã·ã¹ãã ïŒå°ççãªå Žæãå®è¡äžã®ããŒããŠã§ã¢ã«é¢ä¿ãªãïŒã¯ãåããã©ãŒãããæååã«åºã¥ããŠãã®ããŒã¿ãã¢ã³ããã¯ããã²ãŒã ãã£ã©ã¯ã¿ãŒã®æ
å ±ãæ£ããè§£éã§ããŸãã
äžççãªé¢é£æ§ïŒããã¯ããªã¢ã«ã¿ã€ã ã®ãªã³ã©ã€ã³ã²ãŒã ãéèååŒã·ã¹ãã ïŒç²ŸåºŠãéèŠïŒãããã³ç°ãªãåœãããŒããŠã§ã¢ã¢ãŒããã¯ãã£ã«ãŸããã忣ã³ã³ãã¥ãŒãã£ã³ã°ç°å¢ã«ãããŠæãéèŠã§ãã
4. ããŒããŠã§ã¢ããã³çµã¿èŸŒã¿ã·ã¹ãã ãšã®é£æº
å€ãã®ã¢ããªã±ãŒã·ã§ã³ã§ã¯ãPythonã¹ã¯ãªããã¯ã«ã¹ã¿ã ãã€ããªåœ¢åŒãå©çšããããŒããŠã§ã¢ããã€ã¹ãçµã¿èŸŒã¿ã·ã¹ãã ãšå¯Ÿè©±ããŸããstruct
ã¢ãžã¥ãŒã«ã¯ããããã®ããã€ã¹ãšããŒã¿ã亀æããã¡ã«ããºã ãæäŸããŸãã
äŸãã°ãã¹ããŒãã»ã³ãµãŒãããããã¢ãŒã ãå¶åŸ¡ããã¢ããªã±ãŒã·ã§ã³ãäœæããŠããå Žåãstruct
ã¢ãžã¥ãŒã«ã䜿çšããŠã³ãã³ããããã€ã¹ãçè§£ã§ãããã€ããªåœ¢åŒã«å€æã§ããŸããããã«ãããPythonã¹ã¯ãªããã¯ã³ãã³ãïŒäŸïŒæž©åºŠèšå®ãã¢ãŒã¿ãŒã®ç§»åïŒãéä¿¡ããããã€ã¹ããããŒã¿ãåä¿¡ã§ããŸããæ¥æ¬ã®ç ç©¶æœèšã®æž©åºŠã»ã³ãµãŒãã¡ãã·ã³æ¹Ÿã®ç³æ²¹æåãªã°ã®å§åã»ã³ãµãŒããéä¿¡ãããããŒã¿ãèããŠã¿ãŠãã ãããstruct
ã¯ããããã®ã»ã³ãµãŒããã®çã®ãã€ããªããŒã¿ãã䜿çšå¯èœãªPythonã®å€ã«å€æã§ããŸãã
äžççãªé¢é£æ§ïŒããã¯ãäžçäžã®IoTïŒã¢ãã®ã€ã³ã¿ãŒãããïŒã¢ããªã±ãŒã·ã§ã³ãèªååãããããå·¥åŠãããã³ç§åŠèšæž¬ã«ãããŠäžå¯æ¬ ã§ããããŒã¿äº€æã®ããã«struct
ãæšæºåããããšã§ãããŸããŸãªããã€ã¹ããã©ãããã©ãŒã éã§ã®çžäºéçšæ§ãçãŸããŸãã
é«åºŠãªäœ¿çšæ³ãšèæ ®äºé
1. å¯å€é·ããŒã¿ã®åãæ±ã
å¯å€é·ããŒã¿ïŒäŸïŒæååããµã€ãºãå€åãããªã¹ãïŒã®æ±ãã¯äžè¬çãªèª²é¡ã§ããstruct
ã¯å¯å€é·ãã£ãŒã«ããçŽæ¥æ±ãããšã¯ã§ããŸããããããã€ãã®ãã¯ããã¯ãçµã¿åãããŠäœ¿çšã§ããŸãïŒ
- é·ãã®æ¥é èŸïŒããŒã¿ã®åã«ãã®é·ããæŽæ°ãšããŠããã¯ããŸããããã«ãããåä¿¡åŽã¯ããŒã¿ã®ããã«äœãã€ãèªãã¹ãããç¥ãããšãã§ããŸãã
- çµç«¯æåã®äœ¿çšïŒããŒã¿ã®çµããã瀺ãããã«ç¹æ®æåïŒäŸïŒãã«ãã€ãã`\x00`ïŒã䜿çšããŸããããã¯æååã§äžè¬çã§ãããçµç«¯æåãããŒã¿ã®äžéšã§ããå Žåã«åé¡ãåŒãèµ·ããå¯èœæ§ããããŸãã
äŸïŒé·ãã®æ¥é èŸïŒïŒ
import struct
# Packing a string with a length prefix
my_string = b'hello world'
string_length = len(my_string)
packed_data = struct.pack('<I %ds' % string_length, string_length, my_string)
print(f'Packed data with length: {packed_data}')
# Unpacking
unpacked_length, unpacked_string = struct.unpack('<I %ds' % struct.unpack('<I', packed_data[:4])[0], packed_data) # The most complex line, it is required to dynamically determine the length of the string when unpacking.
print(f'Unpacked length: {unpacked_length}, Unpacked string: {unpacked_string.decode()}')
å®è·µçãªæŽå¯ïŒå¯å€é·ããŒã¿ãæ±ãéã«ã¯ãããŒã¿ãšéä¿¡ãããã³ã«ã«é©ããæ¹æ³ãæ éã«éžæããŠãã ãããé·ãã®æ¥é èŸãä»ããããšã¯ãå®å šã§ä¿¡é Œæ§ã®é«ãã¢ãããŒãã§ãããã©ãŒãããæååã®åçãªäœ¿çšïŒäŸã®`%ds`ïŒã«ãããããŸããŸãªããŒã¿ãµã€ãºã«å¯Ÿå¿ã§ããéåžžã«äŸ¿å©ãªãã¯ããã¯ã§ãã
2. ã¢ã©ã€ã¡ã³ããšããã£ã³ã°
ããŒã¿æ§é ãããã¯ããéã«ã¯ãã¢ã©ã€ã¡ã³ããšããã£ã³ã°ãèæ
®ããå¿
èŠããããããããŸãããäžéšã®ããŒããŠã§ã¢ã¢ãŒããã¯ãã£ã§ã¯ãããŒã¿ãç¹å®ã®å¢çïŒäŸïŒ4ãã€ããŸãã¯8ãã€ãå¢çïŒã«ã¢ã©ã€ã¡ã³ããããå¿
èŠããããŸããstruct
ã¢ãžã¥ãŒã«ã¯ããã©ãŒãããæååã«åºã¥ããŠãå¿
èŠã«å¿ããŠèªåçã«ããã£ã³ã°ãã€ããæ¿å
¥ããŸãã
é©åãªãã©ãŒãããæåïŒäŸïŒãªãã«ãšã³ãã£ã¢ã³ãŸãã¯ããã°ãšã³ãã£ã¢ã³ã«ã¢ã©ã€ã¡ã³ãããããã«`<`ãŸãã¯`>`ãã€ããªãŒããŒæå®åã䜿çšãããããã«ãã䜿çšãããããã£ã³ã°ã«åœ±é¿ããå¯èœæ§ãããïŒã䜿çšããããšã§ãã¢ã©ã€ã¡ã³ããå¶åŸ¡ã§ããŸãããŸãã¯ã`x`ãã©ãŒãããæåã䜿çšããŠæç€ºçã«ããã£ã³ã°ãã€ãã远å ããããšãã§ããŸãã
å®è·µçãªæŽå¯ïŒããã©ãŒãã³ã¹ãæé©åããæœåšçãªåé¡ãåé¿ããããã«ãã¿ãŒã²ããã¢ãŒããã¯ãã£ã®ã¢ã©ã€ã¡ã³ãèŠä»¶ãçè§£ããŠãã ãããæ£ãããã€ããªãŒããŒãæ éã«äœ¿çšããå¿ èŠã«å¿ããŠããã£ã³ã°ã管çããããã«ãã©ãŒãããæååã調æŽããŠãã ããã
3. ãšã©ãŒãã³ããªã³ã°
ãã€ããªããŒã¿ãæ±ãéã«ã¯ãå ç¢ãªãšã©ãŒãã³ããªã³ã°ãäžå¯æ¬ ã§ããç¡å¹ãªå ¥åããŒã¿ãäžæ£ãªãã©ãŒãããæååããŸãã¯ããŒã¿ã®ç Žæã¯ãäºæããªãåäœãã»ãã¥ãªãã£ã®è匱æ§ã«ã€ãªããå¯èœæ§ããããŸãã以äžã®ãã¹ããã©ã¯ãã£ã¹ãå®è£ ããŠãã ããïŒ
- å ¥åæ€èšŒïŒãããã³ã°åã«ãå ¥åããŒã¿ãæåŸ ããã圢åŒãšå¶çŽãæºãããŠããããšãæ€èšŒããŸãã
- ãšã©ãŒãã§ãã¯ïŒãããã³ã°ããã³ã¢ã³ãããã³ã°æäœäžã«æœåšçãªãšã©ãŒïŒäŸïŒ`struct.error`äŸå€ïŒã確èªããŸãã
- ããŒã¿æŽåæ§ãã§ãã¯ïŒãã§ãã¯ãµã ããã®ä»ã®ããŒã¿æŽåæ§ã¡ã«ããºã ã䜿çšããŠãããŒã¿ã®ç Žæãæ€åºããŸãã
äŸïŒãšã©ãŒãã³ããªã³ã°ïŒïŒ
import struct
def unpack_data(data, format_string):
try:
unpacked_data = struct.unpack(format_string, data)
return unpacked_data
except struct.error as e:
print(f'Error unpacking data: {e}')
return None
# Example of an invalid format string:
data = struct.pack('i', 12345)
result = unpack_data(data, 's') # This will cause an error
if result is not None:
print(f'Unpacked: {result}')
å®è·µçãªæŽå¯ïŒã³ãŒããããå埩åãããä¿¡é Œæ§ã®é«ããã®ã«ããããã«ãå æ¬çãªãšã©ãŒãã³ããªã³ã°ãå®è£ ããŠãã ãããæœåšçãªäŸå€ãåŠçããããã«try-exceptãããã¯ã䜿çšããããšãæ€èšããŠãã ãããããŒã¿æ€èšŒæè¡ã䜿çšããŠããŒã¿ã®æŽåæ§ãåäžãããŠãã ããã
4. ããã©ãŒãã³ã¹ã«é¢ããèæ ®äºé
struct
ã¢ãžã¥ãŒã«ã¯åŒ·åã§ãããéåžžã«å€§ããªããŒã¿ã»ããã«å¯ŸããŠã¯ãä»ã®ããŒã¿ã·ãªã¢ã©ã€ãŒãŒã·ã§ã³æè¡ãããããã©ãŒãã³ã¹ãå£ãããšããããŸããããã©ãŒãã³ã¹ãéèŠãªå Žåã¯ã以äžãèæ
®ããŠãã ããïŒ
- ãã©ãŒãããæååã®æé©åïŒå¯èœãªéãæãå¹ççãªãã©ãŒãããæååã䜿çšããŠãã ãããäŸãã°ãåãåã®è€æ°ã®ãã£ãŒã«ããçµã¿åãããïŒäŸïŒ`i i i i`ã®ä»£ããã«`iiii`ïŒããšã§ãããã©ãŒãã³ã¹ãåäžããããšããããŸãã
- 代æ¿ã©ã€ãã©ãªã®æ€èšïŒããã©ãŒãã³ã¹ãéåžžã«éèŠãªã¢ããªã±ãŒã·ã§ã³ã§ã¯ã`protobuf`ïŒProtocol BuffersïŒã`capnp`ïŒCap'n ProtoïŒããŸãã¯`numpy`ïŒæ°å€ããŒã¿çšïŒã`pickle`ïŒãã ããpickleã¯ã»ãã¥ãªãã£äžã®æžå¿µãããããã¯ãŒã¯ããŒã¿ã«ã¯äžè¬çã«äœ¿çšãããŸããïŒãªã©ã®ä»£æ¿ã©ã€ãã©ãªã調æ»ããŠãã ããããããã¯ããé«éãªã·ãªã¢ã©ã€ãŒãŒã·ã§ã³ããã³ãã·ãªã¢ã©ã€ãŒãŒã·ã§ã³é床ãæäŸããå¯èœæ§ããããŸãããåŠç¿æ²ç·ãæ¥ã«ãªãå ŽåããããŸãããããã®ã©ã€ãã©ãªã«ã¯ããããé·æãšçæãããããããããžã§ã¯ãã®ç¹å®ã®èŠä»¶ã«åã£ããã®ãéžæããŠãã ããã
- ãã³ãããŒã¯ïŒããã©ãŒãã³ã¹ã®ããã«ããã¯ãç¹å®ããããã«å¿ããŠæé©åããããã«ãåžžã«ã³ãŒãã®ãã³ãããŒã¯ãè¡ã£ãŠãã ããã
å®è·µçãªæŽå¯ïŒäžè¬çãªãã€ããªããŒã¿åŠçã«ã¯ãstruct
ã§ååãªå Žåãå€ãã§ããããã©ãŒãã³ã¹éèŠã®ã·ããªãªã§ã¯ãã³ãŒãããããã¡ã€ãªã³ã°ãã代æ¿ã®ã·ãªã¢ã©ã€ãŒãŒã·ã§ã³æ¹æ³ãæ€èšããŠãã ãããå¯èœãªå Žåã¯ãããªã³ã³ãã€ã«ãããããŒã¿åœ¢åŒã䜿çšããŠããŒã¿è§£æãé«éåããŠãã ããã
ãŸãšã
struct
ã¢ãžã¥ãŒã«ã¯ãPythonã§ãã€ããªããŒã¿ãæ±ãããã®åºæ¬çãªããŒã«ã§ããããã«ãããäžçäžã®éçºè
ã¯ããŒã¿ãå¹ççã«ããã¯ããã³ã¢ã³ããã¯ã§ãããããã¯ãŒã¯ããã°ã©ãã³ã°ããã¡ã€ã«I/OãããŒã¿ã·ãªã¢ã©ã€ãŒãŒã·ã§ã³ãããã³ä»ã®ã·ã¹ãã ãšã®å¯Ÿè©±ã«æé©ã§ãããã©ãŒãããæååããã€ããªãŒããŒãããã³é«åºŠãªãã¯ããã¯ããã¹ã¿ãŒããããšã§ãstruct
ã¢ãžã¥ãŒã«ã䜿çšããŠè€éãªããŒã¿åŠçã®åé¡ã解決ã§ããŸããäžèšã§æç€ºããã°ããŒãã«ãªäŸã¯ãããŸããŸãªåœéçãªãŠãŒã¹ã±ãŒã¹ã§ã®ãã®é©çšæ§ã瀺ããŠããŸãããã€ããªããŒã¿ãæ±ãéã«ã¯ãå
ç¢ãªãšã©ãŒãã³ããªã³ã°ãå®è£
ããããã©ãŒãã³ã¹ãžã®åœ±é¿ãèæ
®ããããšãå¿ããªãã§ãã ããããã®ã¬ã€ããéããŠããããžã§ã¯ãã§struct
ã¢ãžã¥ãŒã«ã广çã«äœ¿çšããäžçã«åœ±é¿ãäžããã¢ããªã±ãŒã·ã§ã³ã§ãã€ããªããŒã¿ãåŠçã§ããããã«ãªãã¯ãã§ãã
ãããªãåŠç¿ãšãªãœãŒã¹
- Pythonããã¥ã¡ã³ãïŒ
struct
ã¢ãžã¥ãŒã«ã®å ¬åŒPythonããã¥ã¡ã³ãïŒ[https://docs.python.org/3/library/struct.html](https://docs.python.org/3/library/struct.html)ïŒã¯æ±ºå®çãªãªãœãŒã¹ã§ãããã©ãŒãããæååã颿°ãããã³äŸãç¶²çŸ ããŠããŸãã - ãã¥ãŒããªã¢ã«ãšäŸïŒæ°å€ãã®ãªã³ã©ã€ã³ãã¥ãŒããªã¢ã«ãšäŸãã
struct
ã¢ãžã¥ãŒã«ã®ç¹å®ã®å¿çšã瀺ããŠããŸãããPython struct ãã¥ãŒããªã¢ã«ãã§æ€çŽ¢ããŠãããŒãºã«åã£ããªãœãŒã¹ãèŠã€ããŠãã ããã - ã³ãã¥ããã£ãã©ãŒã©ã ïŒPythonã³ãã¥ããã£ãã©ãŒã©ã ïŒäŸïŒStack OverflowãPythonã¡ãŒãªã³ã°ãªã¹ãïŒã«åå ããŠãå©ããæ±ããããä»ã®éçºè ããåŠãã ãããŠãã ããã
- ãã€ããªããŒã¿çšã©ã€ãã©ãªïŒ
protobuf
ãcapnp
ãnumpy
ãªã©ã®ã©ã€ãã©ãªã«æ £ã芪ããã§ãã ããã
ç¶ç¶çã«åŠç¿ãšå®è·µãéããããšã§ãstruct
ã¢ãžã¥ãŒã«ã®åãæŽ»çšããããŸããŸãªã»ã¯ã¿ãŒãå°åã§é©çšå¯èœãªé©æ°çã§å¹ççãªãœãããŠã§ã¢ãœãªã¥ãŒã·ã§ã³ãæ§ç¯ã§ããŸãããã®ã¬ã€ãã§æç€ºãããããŒã«ãšç¥èã«ãããããªãã¯ãã€ããªããŒã¿æäœã®æè¡ãç¿åŸããéãæ©ãã§ããŸãã